home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / cd_lib / src / cdr_read.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  1.6 KB  |  70 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <dos.h>
  4. #include "define.h"
  5. /* #include <cdrfrb.h> */
  6.  
  7. #ifdef DEBUG
  8. main(int argc, char *argv[])
  9. {
  10.     long int sec;
  11.     char buf[2340];
  12.     int i;
  13.     
  14.     if (argc > 1) {
  15.         printf("input is %s\n", argv[1]);
  16.         sec = atol(argv[1]);
  17.         printf("read %lx sector\n", sec);
  18.         printf("return is %x\n", cdr_read(0, sec, buf, 1));
  19.         for (i=0; i<2048; i++) {
  20.             printf("%2x", buf[i]);
  21.             if ((i & 0x1f) == 0x1f) {
  22.                 puts("");
  23.             }
  24.         }
  25.     }
  26. }
  27. #endif
  28.  
  29. /* データの読み取り(論理セクタ指定) */
  30. /*
  31.  * device_no:   device number (Towns CD-ROM -> 0)
  32.  * sector_number:     論理セクタ番号
  33.  * buffer: 転送アドレス
  34.  * count:   読み込みセクタ数
  35.  * return: 0 -> 正常終了, 0以外 -> エラー
  36.  */
  37.  
  38. int cdr_read(int device_no, long int sector_number, char *buffer, u_int count)
  39. {
  40.     union REGS reg;
  41.     struct SREGS seg;
  42.  
  43.     if (buffer == NULL) {
  44.         return -1;
  45.     }
  46.     
  47.     segread(&seg);
  48.     reg.h.ah = 0x05;
  49.     reg.h.al = (0xC0 | (u_char) device_no);
  50.     reg.x.cx = 0x0000;
  51.     reg.h.cl = (u_char) (((u_long) sector_number) >> 16);    /* High */
  52.     reg.x.dx = (u_int) (sector_number & 0x00ffff); /* Low */
  53.     reg.x.bx = count;
  54.     reg.x.di = (u_int) buffer;
  55.     
  56.     int86x(0x93, ®, ®, &seg);
  57.  
  58.     if (reg.h.ah == 0) {
  59.         return 0;
  60.     } else if (reg.h.ah == 0x02) {   /* device number error */
  61.         return DEVERR;
  62.     } else if (reg.h.ah == 0x10) {   /* cd-da plaing */
  63.         return DEVPLY;
  64.     } else {                         /* (reg.h.ah == 0x80) hard ware error */
  65.         return reg.x.cx;
  66.     }
  67. }
  68.  
  69. #define cdr_read2(device_no, sector_number, buffer, count) cdr_read(device_no,  sector_number, buffer, count)
  70.